import common
import unittest

class test_describe(common.TestCase):

    def test_describe(self):
        result = self.db.describe('EMP')

        # delete stuff which can change across setups here
        del result['OCI_ATTR_OBJ_ID']        
        del result['OCI_ATTR_OBJID']
        del result['OCI_ATTR_OBJ_SCHEMA']
        
        expected = {
            'OCI_ATTR_CLUSTERED': 0,
            'OCI_ATTR_PTYPE': 1,
            'OCI_ATTR_TABLESPACE': 0,
            'OCI_ATTR_NUM_COLS': 8,
            'OCI_ATTR_INDEX_ONLY': 0,
            'OCI_ATTR_IS_TEMPORARY': 0,
            'OCI_ATTR_OBJ_NAME': 'EMP',
            'OCI_ATTR_PARTITIONED': 0,
            'OCI_ATTR_LIST_COLUMNS': [
                {'OCI_ATTR_DATA_TYPE': 2,
                 'OCI_ATTR_SCALE': 0,
                 'OCI_ATTR_SCHEMA_NAME': None,
                 'OCI_ATTR_CHARSET_FORM': 0,
                 'OCI_ATTR_PRECISION': 4,
                 'OCI_ATTR_NAME': 'EMPNO',
                 'OCI_ATTR_PTYPE': 9,
                 'OCI_ATTR_IS_NULL': 0,
                 'OCI_ATTR_CHARSET_ID': 0,
                 'OCI_ATTR_DATA_SIZE': 22},
                {'OCI_ATTR_DATA_TYPE': 1,
                 'OCI_ATTR_SCALE': 0,
                 'OCI_ATTR_SCHEMA_NAME': None,
                 'OCI_ATTR_CHARSET_FORM': 1,
                 'OCI_ATTR_PRECISION': 0,
                 'OCI_ATTR_NAME': 'ENAME',
                 'OCI_ATTR_PTYPE': 9,
                 'OCI_ATTR_IS_NULL': 1,
                 'OCI_ATTR_CHARSET_ID': 1,
                 'OCI_ATTR_DATA_SIZE': 10},
                {'OCI_ATTR_DATA_TYPE': 1,
                 'OCI_ATTR_SCALE': 0,
                 'OCI_ATTR_SCHEMA_NAME': None,
                 'OCI_ATTR_CHARSET_FORM': 1,
                 'OCI_ATTR_PRECISION': 0,
                 'OCI_ATTR_NAME': 'JOB',
                 'OCI_ATTR_PTYPE': 9,
                 'OCI_ATTR_IS_NULL': 1,
                 'OCI_ATTR_CHARSET_ID': 1,
                 'OCI_ATTR_DATA_SIZE': 9},
                {'OCI_ATTR_DATA_TYPE': 2,
                 'OCI_ATTR_SCALE': 0,
                 'OCI_ATTR_SCHEMA_NAME': None,
                 'OCI_ATTR_CHARSET_FORM': 0,
                 'OCI_ATTR_PRECISION': 4,
                 'OCI_ATTR_NAME': 'MGR',
                 'OCI_ATTR_PTYPE': 9,
                 'OCI_ATTR_IS_NULL': 1,
                 'OCI_ATTR_CHARSET_ID': 0,
                 'OCI_ATTR_DATA_SIZE': 22},
                {'OCI_ATTR_DATA_TYPE': 12,
                 'OCI_ATTR_SCALE': 0,
                 'OCI_ATTR_SCHEMA_NAME': None,
                 'OCI_ATTR_CHARSET_FORM': 0,
                 'OCI_ATTR_PRECISION': 0,
                 'OCI_ATTR_NAME': 'HIREDATE',
                 'OCI_ATTR_PTYPE': 9, 'OCI_ATTR_IS_NULL': 1,
                 'OCI_ATTR_CHARSET_ID': 0,
                 'OCI_ATTR_DATA_SIZE': 7},
                {'OCI_ATTR_DATA_TYPE': 2,
                 'OCI_ATTR_SCALE': 2,
                 'OCI_ATTR_SCHEMA_NAME': None,
                 'OCI_ATTR_CHARSET_FORM': 0,
                 'OCI_ATTR_PRECISION': 7,
                 'OCI_ATTR_NAME': 'SAL',
                 'OCI_ATTR_PTYPE': 9,
                 'OCI_ATTR_IS_NULL': 1,
                 'OCI_ATTR_CHARSET_ID': 0,
                 'OCI_ATTR_DATA_SIZE': 22},
                {'OCI_ATTR_DATA_TYPE': 2,
                 'OCI_ATTR_SCALE': 2,
                 'OCI_ATTR_SCHEMA_NAME': None,
                 'OCI_ATTR_CHARSET_FORM': 0,
                 'OCI_ATTR_PRECISION': 7,
                 'OCI_ATTR_NAME': 'COMM',
                 'OCI_ATTR_PTYPE': 9,
                 'OCI_ATTR_IS_NULL': 1,
                 'OCI_ATTR_CHARSET_ID': 0,
                 'OCI_ATTR_DATA_SIZE': 22},
                {'OCI_ATTR_DATA_TYPE': 2,
                 'OCI_ATTR_SCALE': 0,
                 'OCI_ATTR_SCHEMA_NAME': None,
                 'OCI_ATTR_CHARSET_FORM': 0,
                 'OCI_ATTR_PRECISION': 2,
                 'OCI_ATTR_NAME': 'DEPTNO',
                 'OCI_ATTR_PTYPE': 9,
                 'OCI_ATTR_IS_NULL': 1,
                 'OCI_ATTR_CHARSET_ID': 0,
                 'OCI_ATTR_DATA_SIZE': 22}
                ],
            }

        incorrect = []
        not_present = []
        for key,value in expected.items():
            try:
                found = result[key]
                if found!=value:
                    incorrect.append((key,value,found))
                del result[key]
            except KeyError:
                not_present.append(key)
        extra = result.keys()

        if incorrect or not_present or extra:
            self.fail("""
The following keys were incorrect:
%s

The following keys were not present:
%s

The following keys were found in the result but were not expected:
%s
""" % (
         '\n'.join(['%s: found:%s expected:%s' % (i[0],i[2],i[1]) for i in incorrect]),
         '\n'.join(not_present),
         '\n'.join(extra),
         ))
            
if __name__ == '__main__':
    unittest.main()
